/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.yonsei.iwb.smarttv.result;

import com.hp.hpl.jena.rdf.model.ResIterator;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;
import java.util.Set;
import java.util.Vector;

/**
 * 검색 결과 인스턴스에 대한 타입 정보를 저장하기 위한 클래스로써 하나의 인스턴스는 하나 이상의 클래스의 인스턴스에 포함될 수 있기 때문에
 * Vector 형태의 구조를 가지고 있으며, 이 때 해당 인스턴스가 속해 있는 최하위 클래스만을 대상으로 한다.
 *
 *
 * @author Onlyjiny
 */
public class ResultTypeInfo extends Vector<ResultNode> {

    public ResultTypeInfo(Resource r) {
        
        StmtIterator iter = r.listProperties(RDF.type);
        while (iter.hasNext()) {
            Statement statement = iter.nextStatement();
            Resource object = statement.getObject().asResource();
            // 최소단위 클래스만 추가
            ResIterator subClass = statement.getModel().listSubjectsWithProperty(RDFS.subClassOf, object);
            
//            if (!subClass.hasNext()) {
            if (subClass.toSet().size() <= 1) {
                if (object.isURIResource()) {
                    if (!object.equals(RDFS.Class)) {
                        this.add(new ResultNode(object));
                    }
//                    } else {
//                        if (object.equals(OWL.Class) || object.equals(RDFS.Class) || object.equals(OWL.ObjectProperty) || object.equals(OWL.DatatypeProperty)) {
//                            this.add(new ResultNode(object));
//                        }
//                    }
                }
            }
        }
    }

    public ResultTypeInfo(ResultNode rn) {
        this.add(rn);
    }

    public boolean isOWLProperty() {
        for (int i = 0; i < this.size(); i++) {
            ResultNode rn = this.get(i);
            if (rn.equals(OWL.ObjectProperty) || rn.equals(OWL.DatatypeProperty)) {
                return true;
            }
        }
        return false;
    }

    public boolean isClass() {
        for (int i = 0; i < this.size(); i++) {
            ResultNode rn = this.get(i);
            if (rn.equals(OWL.Class) || rn.equals(RDFS.Class)) {
                return true;
            }
        }
        return false;
    }

    public boolean contains(Resource o) {
        boolean bool = false;
        for (int i = 0; i < this.size(); i++) {
            Resource r = this.get(i).getResultNode();
            if (r.equals(o)) {
                bool = true;
                break;
            }
        }
        return bool;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("Type:\n");
        for (int i = 0; i < this.size(); i++) {
            sb.append("\t" + this.get(i).toString());
        }
        return sb.toString();
    }
}
